Skip to content

feat: v1 declares memory; the audit argues with the spec's own claim (0.3.0) - #15

Merged
RevenuePuzzles merged 1 commit into
mainfrom
claude/v1-memory-and-claimed-stage
Sep 4, 2026
Merged

feat: v1 declares memory; the audit argues with the spec's own claim (0.3.0)#15
RevenuePuzzles merged 1 commit into
mainfrom
claude/v1-memory-and-claimed-stage

Conversation

@RevenuePuzzles

Copy link
Copy Markdown
Contributor

What this PR does

Closes the two holes #14 left out of scope. On reflection neither needed a decision first: the memory shape already existed in this repo, and comparing a claim against a computation is a tool feature, not vocabulary.

1. agent-spec v1 declares memory

A required block, per scope: name, purpose, retention, user_visible, user_editable, lawful_basis, plus a forget mechanism. The shape follows memory-policy.schema.yaml — ported, not invented.

Required rather than optional. An agent that keeps nothing writes memory: { persistent: false }, because silence and "none" are different claims and only one of them is checkable.

What that fixes:

  • aux.H08 is scoreable under v1, so memory_amnesia, preference_ignored and context_leak are reachable from a v1 spec again. A quarter of the taxonomy was out of reach.
  • aux.T02 Contextual Trust is assessable, so the ladder can pass it.
  • v1 says more than v0 could: whether each scope is bounded, and whether the user can have it forgotten. A retention period with no forget mechanism is a promise about the calendar, not a control the user holds.

A bug this surfaced. I wrote a test expecting a hidden, uneditable, ten-year scope to score badly on aux.H08 — and it scored present, because my v1 rule read persistence and retention but ignored visibility and editability entirely. The fix is the split v0 already made: memory the user cannot see costs aux.H02, memory they cannot correct costs aux.H03, and aux.H08 stays about whether the agent remembers usefully. The test now asserts that routing.

2. The audit argues with the claim

A v1 spec may declare a trust_stage. It is never an input to the score — it is compared against it:

**Score 11/100 · Grade F · Trust stage: none earned**

> The spec claims *advocacy*; the evidence supports *no stage at all*.
> A stage is earned by what the spec can show, not by what it says about itself.

The finding names what blocks it: "the spec claims aux.T04 Advocacy Trust; the evidence supports no stage at all — blocked by aux.H06, aux.H10, aux.H05, aux.H07". Severity high.

Claiming less than the evidence supports is surfaced next to the computed stage and nothing more. Modesty is not a defect — and the reference example under-claims (aux.T02 while earning advocacy), which a test now pins.

Linked Issue

Follows up #10 and #14. Nothing left open on either.

Type

  • New pattern
  • New gap
  • Teardown
  • Framework edit (must include rationale, ID migration note if renamed, updated examples)
  • Schema fix
  • Doc fix / typo / link
  • Other

Migration note: memory becomes a required field in agent-spec v1, which landed hours ago and has no specs written against it outside this repo, so the migration cost is the two fixtures updated here. No IDs introduced or renamed — the block reuses memory-policy.schema.yaml's field names. schemas/MIGRATION.md documents it. v0.1.0 is untouched.

aux-audit goes to 0.3.0: aux.H02, aux.H03 and aux.H08 measure differently under v1 than in 0.2.0, so v1 scores are not comparable across that boundary. v0 scores are unchanged from 0.1.x.

Contribution bar — checklist

  • I've read CONTRIBUTING.md.
  • If this introduces or renames an ID, I opened a debate Issue first. — none introduced or renamed.
  • If this adds a pattern, it has a diagram, a runnable example, and an anti-pattern. — n/a.
  • If this adds a gap, it has a reproducible scenario and references a heuristic or trust stage. — n/a; three existing gaps become reachable.
  • CI passes (schema validation, link check). — verified locally: 55 tests (up from 48), schemas/validate.py PASSED, check-coverage.py 12/12, yamllint clean, check:schemas clean, links resolve, v1 still validates as draft 2020-12.
  • No emoji in code or schemas.
  • Short sentences. Named things over adjectives.

Deliberately not in this PR

Two items from #9's out-of-scope list stay open, and they are coupled: the incoming pattern catalogue for trust-contract.yaml uses the other fix-pattern vocabulary (dissent-surface, scope-boundary), so adopting it means renaming shipped pattern folders, their diagrams and check-coverage.py. Nothing in the repo is currently broken by this — the seven patterns are internally consistent — so it is an unexplored alternative rather than a defect, and it needs a debate Issue before anyone touches it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MhpqWEvwKp7NrmJfdXYq4M


Generated by Claude Code

…(0.3.0)

Two holes named in #14's out-of-scope, closed. Neither needed a decision:
the memory shape already existed in this repo, and comparing a claim
against a computation is a tool feature, not vocabulary.

## agent-spec v1 declares memory

A required block, per scope: name, purpose, retention, user_visible,
user_editable, lawful_basis, plus a forget mechanism. The shape follows
memory-policy.schema.yaml, so nothing was invented — it was ported.

Required, not optional. An agent that keeps nothing writes
`memory: { persistent: false }`, because silence and "none" are different
claims and only one of them is checkable.

Consequences:

- aux.H08 is scoreable under v1, so the three memory gaps in the taxonomy
  (memory_amnesia, preference_ignored, context_leak) are reachable from a
  v1 spec again. A quarter of the taxonomy was out of reach.
- aux.T02 Contextual Trust is assessable, so the ladder can pass it.
- v1 says more than v0 could: whether each scope is bounded, and whether
  the user can have it forgotten. A retention period with no forget
  mechanism is a promise about the calendar, not a control the user
  holds.
- Memory the user cannot see costs aux.H02; memory they cannot correct
  costs aux.H03. Same split v0 made, where user_editable fed H03. Caught
  by a test that expected H08 to punish a hidden ten-year scope and found
  the rule ignoring visibility entirely.

## The audit argues with the claim

v1 specs may declare a trust_stage. It is never an input to the score. It
is compared against it:

  The spec claims advocacy; the evidence supports no stage at all.
  A stage is earned by what the spec can show, not by what it says
  about itself.

Claiming more than the evidence supports is a `high` finding naming what
blocks it. Claiming less is surfaced next to the computed stage and
nothing more — modesty is not a defect, and the reference example
under-claims, which is now pinned by a test.

55 tests, up from 48. v0 scoring unchanged: 100/A/advocacy and 4/F, same
evidence strings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MhpqWEvwKp7NrmJfdXYq4M
@RevenuePuzzles
RevenuePuzzles merged commit 2e62d23 into main Sep 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants